/**
 * 控制台彩色日志工具
 */

// 预设样式
const presets = {
  // 标题样式
  title: 'background:#0a0; color:#fff; font-size:16px; padding:4px 8px; border-radius:4px;',
  subtitle: 'background:#1E90FF; color:#fff; font-size:14px; padding:2px 6px; border-radius:4px;',
  
  // 文本样式
  key: 'color:#1E90FF; font-weight:bold;',
  value: 'color:#32CD32; font-weight:bold;',
  warning: 'color:#FF8C00; font-weight:bold;',
  error: 'color:#FF4500; font-weight:bold;',
  success: 'color:#32CD32; font-weight:bold;',
  info: 'color:#9932CC; font-weight:bold;',
  
  // 背景样式
  primaryBg: 'background:#1E90FF; color:#fff; padding:2px 6px; border-radius:2px;',
  successBg: 'background:#0a0; color:#fff; padding:2px 6px; border-radius:2px;',
  warningBg: 'background:#FF8C00; color:#fff; padding:2px 6px; border-radius:2px;',
  errorBg: 'background:#FF4500; color:#fff; padding:2px 6px; border-radius:2px;',
  infoBg: 'background:#800080; color:#fff; padding:2px 6px; border-radius:2px;',
}

// 环境检测
const isDev = process.env.NODE_ENV === 'development';

const colorLog = {
  /**
   * 打印标题
   * @param {string} message 标题文本
   * @param {string} style 自定义样式（可选）
   */
  title(message, style) {
    if (!isDev) return;
    console.log(`%c${message}`, style || presets.title);
  },
  
  /**
   * 打印子标题
   * @param {string} message 子标题文本
   * @param {string} style 自定义样式（可选）
   */
  subtitle(message, style) {
    if (!isDev) return;
    console.log(`%c${message}`, style || presets.subtitle);
  },
  
  /**
   * 打印键值对
   * @param {string} key 键名
   * @param {any} value 值
   * @param {string} keyStyle 键样式（可选）
   * @param {string} valueStyle 值样式（可选）
   */
  keyValue(key, value, keyStyle, valueStyle) {
    if (!isDev) return;
    console.log(`%c${key}: %c${value}`, keyStyle || presets.key, valueStyle || presets.value);
  },
  
  /**
   * 打印成功信息
   * @param {string} message 信息
   * @param {string} style 自定义样式（可选）
   */
  success(message, style) {
    if (!isDev) return;
    console.log(`%c${message}`, style || presets.success);
  },
  
  /**
   * 打印警告信息
   * @param {string} message 信息
   * @param {string} style 自定义样式（可选）
   */
  warning(message, style) {
    if (!isDev) return;
    console.log(`%c${message}`, style || presets.warning);
  },
  
  /**
   * 打印错误信息
   * @param {string} message 信息
   * @param {string} style 自定义样式（可选）
   */
  error(message, style) {
    if (!isDev) return;
    console.log(`%c${message}`, style || presets.error);
  },
  
  /**
   * 打印信息
   * @param {string} message 信息
   * @param {string} style 自定义样式（可选）
   */
  info(message, style) {
    if (!isDev) return;
    console.log(`%c${message}`, style || presets.info);
  },
  
  /**
   * 打印对象
   * @param {string} label 标签
   * @param {Object} obj 要打印的对象
   * @param {string} style 标签样式（可选）
   */
  object(label, obj, style) {
    if (!isDev) return;
    console.log(`%c${label}`, style || presets.subtitle);
    console.dir(obj);
  },
  
  /**
   * 分组打印
   * @param {string} groupName 组名
   * @param {Function} callback 回调函数，内部可调用其他打印方法
   * @param {boolean} collapsed 是否折叠，默认false
   */
  group(groupName, callback, collapsed = false) {
    if (!isDev) return;
    if (collapsed) {
      console.groupCollapsed(groupName);
    } else {
      console.group(groupName);
    }
    callback();
    console.groupEnd();
  },
  
  /**
   * 自定义样式打印
   * @param {string} message 信息
   * @param {string} style 自定义CSS样式
   */
  custom(message, style) {
    if (!isDev) return;
    console.log(`%c${message}`, style);
  },
  
  /**
   * 打印表格
   * @param {Array} data 表格数据
   */
  table(data) {
    if (!isDev) return;
    console.table(data);
  },
  
  /**
   * 打印分隔线
   * @param {string} color 线条颜色（可选，默认为灰色）
   * @param {string} char 分隔线字符（可选，默认为─）
   * @param {number} length 分隔线长度（可选，默认为80）
   */
  divider(color = '#ddd', char = '─', length = 80) {
    if (!isDev) return;
    // 确保长度是有效的正整数
    const safeLength = Math.max(1, Math.min(500, Math.floor(length) || 80));
    const line = char.repeat(safeLength);
    console.log(`%c${line}`, `color:${color}`);
  },
  
  /**
   * 打印带标题的分隔线
   * @param {string} title 标题文本
   * @param {string} color 线条颜色（可选，默认为灰色）
   * @param {string} char 分隔线字符（可选，默认为─）
   * @param {number} length 分隔线长度（可选，默认为80）
   */
  titleDivider(title, color = '#ddd', char = '─', length = 80) {
    if (!isDev) return;
    try {
      // 确保长度是有效的正整数，并限制最大长度
      const safeLength = Math.max(1, Math.min(500, Math.floor(length) || 80));
      const titleLength = (title || '').length + 2; // 加2是为了左右各留一个空格
      
      // 确保标题长度不超过安全长度
      const safeTitleLength = Math.min(titleLength, safeLength - 2);
      
      // 计算左右两边分隔线的长度
      const sideLength = Math.floor((safeLength - safeTitleLength) / 2);
      
      // 确保sideLength是有效的正整数
      const safeSideLength = Math.max(1, sideLength);
      
      const leftSide = char.repeat(safeSideLength);
      const rightSide = char.repeat(Math.max(1, safeLength - safeSideLength - safeTitleLength));
      
      console.log(`%c${leftSide} %c${title} %c${rightSide}`, 
        `color:${color}`, 
        `color:${color}; font-weight:bold`, 
        `color:${color}`);
    } catch (error) {
      // 发生错误时使用简单的备用方案
      console.log(`%c=== ${title} ===`, `color:${color}; font-weight:bold`);
      console.error('titleDivider错误:', error.message);
    }
  },
  
  /**
   * 获取预设样式
   * @returns {Object} 所有预设样式
   */
  getPresets() {
    return presets;
  }
};

export default colorLog; 